 package servidor;

import elementosJuego.Bala;
import elementosJuego.Jugador;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * Responsabilidad: cada cierto tiempo recuperar el estado del juego y enviar la
 * actualización a los jugadores.
 */

public class GestorActualizacion extends Thread{

    private GestorJuego gestorJuego;
    private ArrayList<Integer[]> balas;
    private ArrayList<Integer[]> jugadores;
    private GestorSalida gestorSalida;

    public GestorActualizacion(GestorJuego gestorJuego, GestorSalida gestorSalida){
        this.gestorJuego = gestorJuego;
        this.gestorSalida = gestorSalida;
        balas = new ArrayList<Integer[]>();
        jugadores = new ArrayList<Integer[]>();
        this.start();
    }

    @Override
    public void run(){
        Iterator it;
        while(true){
            jugadores.clear();
            balas.clear();
            synchronized(gestorJuego.getJugadores()){
                it = gestorJuego.getJugadores().entrySet().iterator();
                try {
                    Thread.sleep(15);
                } catch (InterruptedException ex) {
                    Logger.getLogger(GestorActualizacion.class.getName()).log(Level.SEVERE, null, ex);
                }
                while(it.hasNext()){
                    Map.Entry e = (Map.Entry)it.next();
                    Integer jugador[] = {((Jugador)e.getValue()).getX(), ((Jugador)e.getValue()).getY(), ((Jugador)e.getValue()).getId(), ((Jugador)e.getValue()).getVida(), ((Jugador)e.getValue()).getApuntaInt()};
                    jugadores.add(jugador);
                }
            }
            synchronized(gestorJuego.getBalas()){
                for(int i=0;i<(gestorJuego.getBalas()).size();i++){
                    Integer bala[] = {((Bala) (gestorJuego.getBalas()).get(i)).getX(), ((Bala) (gestorJuego.getBalas()).get(i)).getY()};
                    balas.add(bala);
                }
            }
            gestorSalida.enviar(jugadores, balas);
            synchronized(this){
                try {
                    wait();
                } catch (InterruptedException ex) {
                    Logger.getLogger(GestorActualizacion.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }
    }
}
